package com.example;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;

/**
 * @ClassName QuickStartTest5_3
 * @Description TODO
 * @Author zhaoluowei
 * @Date 2019/7/1  21:44
 * @Version 1.0
 */

public class QuickStartTest5_3 {


    @Test
    public void test(){
        //创建SecurityManager工厂
        Factory<SecurityManager> managerFactory = new IniSecurityManagerFactory("classpath:jdbcrealm.ini");

        SecurityManager factoryInstance = managerFactory.getInstance();

        //将SecurityManager 设置当前的运行环境中
        SecurityUtils.setSecurityManager(factoryInstance);

        Subject subject = SecurityUtils.getSubject();
        //构造需要登录用户信息 用户用的
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("jack", "123");

        subject.login(usernamePasswordToken);
        System.out.println(" 认证结果 -->  " + subject.isAuthenticated());
        System.out.println(" 是否有对应的 role1 角色 -->  " + subject.hasRole("role1"));
        //video:buy  video:find
        System.out.println("是否有 video:buy 权限 --> " + subject.isPermitted("video:buy"));
        System.out.println("是否有 video:find 权限 --> " + subject.isPermitted("video:find"));
        //因为Jack 有 role1 role2 角色  role2 角色对应的全是* 所以 他是拥有全部的权限 修改数据库 中role2 的 权限即可 验证。
        System.out.println("是否有 video:* 权限 --> " + subject.isPermitted("video:*"));

    }

    @Test
    public void test2(){
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/shiro?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");

        JdbcRealm jdbcRealm = new JdbcRealm();
        jdbcRealm.setPermissionsLookupEnabled(true);
        jdbcRealm.setDataSource(dataSource);
        securityManager.setRealm(jdbcRealm);


        //将SecurityManager 设置当前的运行环境中 关键步骤
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        //构造需要登录用户信息 用户用的
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("jack", "123");
        subject.login(usernamePasswordToken);
        System.out.println(" 认证结果 -->  " + subject.isAuthenticated());
        System.out.println(" 是否有对应的 role1 角色 -->  " + subject.hasRole("role1"));
        //video:buy  video:find
        System.out.println("是否有 video:buy 权限 --> " + subject.isPermitted("video:buy"));
        System.out.println("是否有 video:find 权限 --> " + subject.isPermitted("video:find"));
        //因为Jack 有 role1 role2 角色  role2 角色对应的全是* 所以 他是拥有全部的权限 修改数据库 中role2 的 权限即可 验证。
        System.out.println("是否有 video:* 权限 --> " + subject.isPermitted("video:*"));

    }




}
